package cn.iocoder.yudao.module.system.service.userassetscode;

import cn.iocoder.yudao.framework.common.pojo.PageResult;
import cn.iocoder.yudao.module.system.controller.admin.userassetscode.vo.UserAssetsCodeUsageLogPageReqVO;
import cn.iocoder.yudao.module.system.dal.dataobject.userassetscode.UserAssetsCodeUsageLogDO;

import javax.validation.Valid;
import java.time.LocalDateTime;
import java.util.List;

/**
 * 兑换码使用记录 Service 接口
 *
 * @author 系统
 */
public interface UserAssetsCodeUsageLogService {

    /**
     * 获得兑换码使用记录分页
     *
     * @param pageReqVO 分页查询
     * @return 兑换码使用记录分页
     */
    PageResult<UserAssetsCodeUsageLogDO> getUserAssetsCodeUsageLogPage(@Valid UserAssetsCodeUsageLogPageReqVO pageReqVO);

    /**
     * 获得兑换码使用记录
     *
     * @param id 编号
     * @return 兑换码使用记录
     */
    UserAssetsCodeUsageLogDO getUserAssetsCodeUsageLog(Long id);

    /**
     * 获得用户的兑换码使用记录
     *
     * @param userId 用户ID
     * @return 兑换码使用记录列表
     */
    List<UserAssetsCodeUsageLogDO> getUserAssetsCodeUsageLogByUserId(Long userId);

    /**
     * 获得指定时间范围内的兑换码使用记录
     *
     * @param startTime 开始时间
     * @param endTime 结束时间
     * @return 兑换码使用记录列表
     */
    List<UserAssetsCodeUsageLogDO> getUserAssetsCodeUsageLogByTimeRange(LocalDateTime startTime, LocalDateTime endTime);

    /**
     * 统计用户的兑换码使用次数
     *
     * @param userId 用户ID
     * @return 使用次数
     */
    Long countUserAssetsCodeUsage(Long userId);

    /**
     * 创建兑换码使用记录
     *
     * @param usageLog 兑换码使用记录
     * @return 编号
     */
    Long createUserAssetsCodeUsageLog(@Valid UserAssetsCodeUsageLogDO usageLog);

    /**
     * 更新兑换码使用记录
     *
     * @param usageLog 兑换码使用记录
     */
    void updateUserAssetsCodeUsageLog(@Valid UserAssetsCodeUsageLogDO usageLog);
}